
((_global_)=>{
	if(!Reflect.has(_global_, 'mtec')){
		Reflect.set(_global_, 'mtec', {});
		Reflect.set(mtec, '__mtec__', 'Many technologies');
	}

	if(!mtec.color){
		Reflect.set(mtec, 'color', {});
	}
	Reflect.set(mtec.color, '__space_description__', 'This is a mtec subnamespace for color');
})(window ?? globalThis);

mtec.color.common = { aliceblue: '#f0f8ff', antiquewhite: '#faebd7', aqua: '#00ffff', aquamarine: '#7fffd4', azure: '#f0ffff', beige: '#f5f5dc', bisque: '#ffe4c4', black: '#000000', blanchedalmond: '#ffebcd', blue: '#0000ff', blueviolet: '#8a2be2', brown: '#a52a2a', burlywood: '#deb887', cadetblue: '#5f9ea0', chartreuse: '#7fff00', chocolate: '#d2691e', coral: '#ff7f50', cornflowerblue: '#6495ed', cornsilk: '#fff8dc', crimson: '#dc143c', cyan: '#00ffff', darkblue: '#00008b', darkcyan: '#008b8b', darkgoldenrod: '#b8860b', darkgray: '#a9a9a9', darkgreen: '#006400', darkkhaki: '#bdb76b', darkmagenta: '#8b008b', darkolivegreen: '#556b2f', darkorange: '#ff8c00', darkorchid: '#9932cc', darkred: '#8b0000', darksalmon: '#e9967a', darkseagreen: '#8fbc8f', darkslateblue: '#483d8b', darkslategray: '#2f4f4f', darkturquoise: '#00ced1', darkviolet: '#9400d3', deeppink: '#ff1493', deepskyblue: '#00bfff', dimgray: '#696969', dodgerblue: '#1e90ff', firebrick: '#b22222', floralwhite: '#fffaf0', forestgreen: '#228b22', fuchsia: '#ff00ff', gainsboro: '#dcdcdc', ghostwhite: '#f8f8ff', gold: '#ffd700', goldenrod: '#daa520', gray: '#808080', green: '#008000', greenyellow: '#adff2f', honeydew: '#f0fff0', hotpink: '#ff69b4', indianred: '#cd5c5c', indigo: '#4b0082', ivory: '#fffff0', khaki: '#f0e68c', lavender: '#e6e6fa', lavenderblush: '#fff0f5', lawngreen: '#7cfc00', lemonchiffon: '#fffacd', lightblue: '#add8e6', lightcoral: '#f08080', lightcyan: '#e0ffff', lightgoldenrodyellow: '#fafad2', lightgray: '#d3d3d3', lightgreen: '#90ee90', lightpink: '#ffb6c1', lightsalmon: '#ffa07a', lightseagreen: '#20b2aa', lightskyblue: '#87cefa', lightslategray: '#778899', lightsteelblue: '#b0c4de', lightyellow: '#ffffe0', lime: '#00ff00', limegreen: '#32cd32', linen: '#faf0e6', magenta: '#ff00ff', maroon: '#800000', mediumaquamarine: '#66cdaa', mediumblue: '#0000cd', mediumorchid: '#ba55d3', mediumpurple: '#9370db', mediumseagreen: '#3cb371', mediumslateblue: '#7b68ee', mediumspringgreen: '#00fa9a', mediumturquoise: '#48d1cc', mediumvioletred: '#c71585', midnightblue: '#191970', mintcream: '#f5fffa', mistyrose: '#ffe4e1', moccasin: '#ffe4b5', navajowhite: '#ffdead', navy: '#000080', oldlace: '#fdf5e6', olive: '#808000', olivedrab: '#6b8e23', orange: '#ffa500', orangered: '#ff4500', orchid: '#da70d6', palegoldenrod: '#eee8aa', palegreen: '#98fb98', paleturquoise: '#afeeee', palevioletred: '#db7093', papayawhip: '#ffefd5', peachpuff: '#ffdab9', peru: '#cd853f', pink: '#ffc0cb', plum: '#dda0dd', powderblue: '#b0e0e6', purple: '#800080', rebeccapurple: '#663399', red: '#ff0000', rosybrown: '#bc8f8f', royalblue: '#4169e1', saddlebrown: '#8b4513', salmon: '#fa8072', sandybrown: '#f4a460', seagreen: '#2e8b57', seashell: '#fff5ee', sienna: '#a0522d', silver: '#c0c0c0', skyblue: '#87ceeb', slateblue: '#6a5acd', slategray: '#708090', snow: '#fffafa', springgreen: '#00ff7f', steelblue: '#4682b4', tan: '#d2b48c', teal: '#008080', thistle: '#d8bfd8', tomato: '#ff6347', turquoise: '#40e0d0', violet: '#ee82ee', wheat: '#f5deb3', white: '#ffffff', whitesmoke: '#f5f5f5', yellow: '#ffff00', yellowgreen: '#9acd32', };

mtec.color.toHexColor = function(color){
	let hex: string;
	if(color.startsWith('#')) hex = color.slice(1, 7);
	else if(!isNaN(Number('0x'+color))) hex = color.slice(0, 6);

	if(hex && [3, 4, 6, 8].includes(hex.length)) return mtec.color.normalizeHexColor('#' + hex);

	color = color.toLowerCase();
	color = Reflect.has(mtec.color.common, color) ? color : 'white';
	return Reflect.get(mtec.color.common, color);
}

mtec.color.normalizeHexColor = function(color){
	let hex: string;
	if(color.startsWith('#') && !isNaN(Number('0x'+color.slice(1, color.length)))) hex = color.replace('#', '');
	else hex = mtec.color.toHexColor(color).replace('#', '');

	if([3, 4].includes(hex.length)) hex = hex.split('').map(bit=>bit+bit).join('');

	if(hex.length>6) hex = hex.substring(0, 6);
	else hex.padEnd(6, '0');

	return '#' + hex.toUpperCase();
}

mtec.color.toRGBColor = function(color){
	let hex = mtec.color.normalizeHexColor(color);
	let [r, g, b] = hex.slice(1, hex.length).match(/.{1,2}/g).map(c=>parseInt(c, 16));
	return [r, g, b];
}

mtec.color.toHSLColor = function(color){
	let [r, g, b] = mtec.color.toRGBColor(color);

	let max = Math.max(r, g, b);
	let min = Math.min(r, g, b);
	let h, s, l = (max + min) / 2;

	if (max === min) {
	  // 如果最大值和最小值相等，表示颜色是灰度的，色相设为0
	  h = s = 0;
	} else {
	  let d = max - min;
	  s = l > 0.5 ? d / (2 - max - min) : d / (max + min);

	  switch (max) {
		case r: h = (g - b) / d + (g < b ? 6 : 0); break;
		case g: h = (b - r) / d + 2; break;
		case b: h = (r - g) / d + 4; break;
	  }

	  h /= 6;
	}

	return [h * 360, s * 100, l * 100].map(v=>Math.round(v)) as [number, number, number];
}

mtec.color.RGB2Hex = function(r, g, b){
	return '#' + [r, g, b].map(v=>v.toString(16).padStart(2, '0')).join('');
}

mtec.color.HSL2Hex = function(h, s, l){
	h /= 360; // 将色相转换为 [0, 1] 范围
	s /= 100; // 将饱和度转换为 [0, 1] 范围
	l /= 100; // 将亮度转换为 [0, 1] 范围

	let r, g, b;

	if (s === 0) {
	  r = g = b = l; // 如果饱和度为 0，则为灰度色
	} else {
	  let hue2rgb = function hue2rgb(p, q, t) {
		if (t < 0) t += 1;
		if (t > 1) t -= 1;
		if (t < 1 / 6) return p + (q - p) * 6 * t;
		if (t < 1 / 2) return q;
		if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
		return p;
	  };

	  let q = l < 0.5 ? l * (1 + s) : l + s - l * s;
	  let p = 2 * l - q;

	  r = hue2rgb(p, q, h + 1 / 3);
	  g = hue2rgb(p, q, h);
	  b = hue2rgb(p, q, h - 1 / 3);
	}

	// 将 [0, 1] 范围的 RGB 值转换为 [0, 255] 范围并四舍五入
	r = Math.round(r * 255);
	g = Math.round(g * 255);
	b = Math.round(b * 255);

	return mtec.color.RGB2Hex(r, g, b);
}

mtec.color.logColorLike = function(cut){
	let list = Reflect.ownKeys(mtec.color.common).filter((color: string)=>color.includes(cut??'')) as string[];

	if(list.length<=0) return void 0;

	let format_str = '';
	let style_list = [];
	let default_style = 'padding: 0 0.5em; font-weight: bolder;';
	let start_style = 'border-top-left-radius: 0.5em 0.5em; border-bottom-left-radius: 0.5em 0.5em;';
	let end_style = 'border-top-right-radius: 0.5em 0.5em; border-bottom-right-radius: 0.5em 0.5em;';

	list.forEach(color=>{
		let hex = mtec.color.normalizeHexColor(Reflect.get(mtec.color.common, color));
		let [h, s, l] = mtec.color.toHSLColor(hex);

		format_str += '%c' + color + '%c' + hex;

		let font_color = mtec.color.HSL2Hex(h, s>0 ? 100 : 0, l>50 ? 20 : 80);

		let style_desc = [
			['background-color', hex],
			['color', font_color]
		].map(item=>item.join(':')).join(';') + ';';

		let style_real = [
			['background-color', hex],
			['color', font_color]
		].map(item=>item.join(':')).join(';') + ';';

		style_list.push(...[start_style + style_desc, style_real + end_style].map(s=>s+default_style));
	});

	console.log(format_str, ...style_list);
}

mtec.color.logFullColorLine = function(size){
	size = size??3;
	let format_str = '';
	let style_list = [];
	let default_style = 'font-weight: lighter; line-height: 5px; font-size: ' + size + 'px;';

	for(let i = 0; i < 360; i++){
		format_str += '%c ';
		style_list.push(default_style + 'background-color: ' + mtec.color.HSL2Hex(i, 100, 50));
	}

	console.log(format_str, ...style_list);
}